Software developers write software programs using one or more software development languages. In order to determine whether or not a particular software program is performing correctly, or to determine the cause of a particular problem, developers can use a tool called a debugger to step through the code and watch what happens in the program. The running program stops at a particular line of source code, such as when a breakpoint is hit. At that moment, the state of program variables, the stack, and other details can be viewed. Unfortunately, the user is left to determine what path the program took to get to where it is currently stopped at. If the user determines this path incorrectly, they have no way of knowing what the correct program sequence actually was. Since problems within software programs are often caused by an incorrect statement execution sequence, it can be extremely difficult to identify the real cause of the problem.
Some debuggers allow the user to look back at the program stack, but the stack is only valid for the current state of the stopped program, and only contains clues about previous program states. There are some tools that show execution call trees, which are the sequence of functions executed over time. These tools are usually insufficient to debug complex problems, since the actions that occur within a function typically cause the majority of the problems in program execution. Thus, just having the function names in order of execution does not provide much insight.